﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidades;
using System.Data;
using System.Data.SqlClient;

namespace AccesoBD
{
    public class ObrasSociales
    {

        public static DataTable ObtenerTodos()
        {
            DataTable tablaOS = null;
            SqlConnection con;
            con = DB.Conectar();
            try
            {
                string comando = "select * from Obra_Social";

                List<SqlParameter> listp = new List<SqlParameter>();

                tablaOS = DB.GenerarTable(comando, listp, con);

                if (tablaOS.Rows.Count > 0)
                {
                    return tablaOS;
                }
            }

            catch (Exception Ex)
            {

                throw new Exception("Error al cargar las Obras Sociales", Ex);
            }
            finally
            {
                con.Close();
            }
            return tablaOS;

        }
        public static ObraSocial ObtenerObraSocialPorNombre(string nombre)
        {
            SqlConnection con = null;
            ObraSocial oS = null;
            try
            {
                con = DB.Conectar();
                string comando = "select * from Obra_Social where siglasOS=@nombre";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nombre", nombre));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    oS = new ObraSocial();
                    oS.idObraSocial = int.Parse(dr["idObraSocial"].ToString());
                    oS.nombre = dr["nombreObraSocial"].ToString();
                    oS.idDomicilio = int.Parse(dr["idDomicilio"].ToString());
                    oS.fechaAlta = DateTime.Parse(dr["fechaAlta"].ToString());
                    oS.siglas = dr["siglasOS"].ToString();
                    if (dr["idConvenioOS"] != DBNull.Value)
                    {
                        oS.idConvenioObraSocial = int.Parse(dr["idConvenioOS"].ToString());
                    }
                    if (dr["descripcion"] != DBNull.Value)
                    {
                        oS.descripcion = dr["descripcion"].ToString();
                    }
                    if (dr["fechaBaja"] != DBNull.Value)
                    {
                        oS.fechaBaja = DateTime.Parse(dr["fechaBaja"].ToString());
                    }


                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al cargar una obra social", Ex);
            }
            finally
            {
                con.Close();
            }
            return oS;
        }
        public static DataTable ObtenerTodasOSActivas()
        {
            DataTable tablaOS = null;
            SqlConnection con;
            con = DB.Conectar();
            try
            {
                string comando = "select * from Obra_Social where fechaBaja=''";

                List<SqlParameter> listp = new List<SqlParameter>();

                tablaOS = DB.GenerarTable(comando, listp, con);

                if (tablaOS.Rows.Count > 0)
                {
                    return tablaOS;
                }
            }

            catch (Exception Ex)
            {

                throw new Exception("Error al cargar las Obras Sociales", Ex);
            }
            finally
            {
                con.Close();
            }
            return tablaOS;

        }


        public static bool ObtenerExistenciaOOSSPorCuit(long cuit)
        {
            SqlConnection con = null;
            bool resultado = false;
            try
            {
                con = DB.Conectar();

                string comando = "Select * from Obra_Social where cuit=@cuit";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@cuit", cuit));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    resultado = true;
                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al cargar La Obra social", Ex);
            }
            finally
            {
                con.Close();
            }

            return resultado;

        }
        public static ObraSocial ObtenerExistenciaOOSSPorNombre(string nombre)
        {
            SqlConnection con = null;
            ObraSocial oS = null;

            try
            {
                con = DB.Conectar();

                string comando = "Select * from Obra_Social where nombreObraSocial=@nombreObraSocial";
                List<SqlParameter> listp = new List<SqlParameter>();
                listp.Add(new SqlParameter("@nombreObraSocial", nombre));
                SqlDataReader dr = DB.GenerarReader(comando, listp, con);
                if (dr.Read())
                {
                    oS.nombre = dr["nombreObraSocial"].ToString();
                    oS.siglas = dr["cuit"].ToString();
                    oS.idObraSocial = int.Parse(dr["idObraSocial"].ToString());

                }

            }
            catch (Exception Ex)
            {

                throw new Exception("Error al cargar La Obra social", Ex);
            }
            finally
            {
                con.Close();
            }

            return oS;

        }
        public static int registrarOOSS(ObraSocial oS, Domicilio oD)
        {
            SqlConnection con = null;
            SqlTransaction tran = null;

            int resultado = 0;
            try
            {
                con = DB.Conectar();
                tran = con.BeginTransaction();

                string comando = "insert into Domicilio (calle, numero, idBarrio, piso, departamento,codigoPostal) values(@calle, @numero, @idBarrio,@piso,@departamento,@codigoPostal)";
                List<SqlParameter> listp = new List<SqlParameter>();

                listp.Add(new SqlParameter("@calle", oD.calle));
                listp.Add(new SqlParameter("@numero", oD.numero));
                listp.Add(new SqlParameter("@idBarrio", oD.idBarrio));
                if (oD.piso == null)
                {
                    listp.Add(new SqlParameter("@Piso", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@Piso", oD.piso));
                }
                if (oD.Departamento == null)
                {
                    listp.Add(new SqlParameter("@departamento", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@departamento", oD.Departamento));

                }
                if (oD.codPostal == null)
                {
                    listp.Add(new SqlParameter("@codigoPostal", DBNull.Value));
                }
                else
                {
                    listp.Add(new SqlParameter("@codigoPostal", oD.codPostal));

                }

                resultado = DB.EjecutarCommand(comando, listp, con, tran);

                if (resultado > 0)
                {
                    oS.idDomicilio = Domicilios.ObtenerUltimoIDDomicilio(tran, con);
                    comando = "INSERT INTO Obra_Social (nombreObraSocial, cuit, descripcion, idDomicilio, fechaAlta, siglasOS, telefono, mail, tieneConvVigente) "
                            + "VALUES (@nombreOS,@cuit,@descripcion,@idDom,@fechaAlta,@sigla,@telefono,@mail,@tieneConv)";
                    listp = null;
                    listp = new List<SqlParameter>();
                    listp.Add(new SqlParameter("@nombreOS", oS.nombre));
                    listp.Add(new SqlParameter("@cuit", oS.cuit));
                    listp.Add(new SqlParameter("@idDom", oS.idDomicilio));
                    listp.Add(new SqlParameter("@fechaAlta", oS.fechaAlta));
                    listp.Add(new SqlParameter("@sigla", oS.siglas));
                    listp.Add(new SqlParameter("@telefono", oS.telefono));
                    listp.Add(new SqlParameter("@tieneConv", false)); //en el momento que le estamos haciendo el alta no tiene su convenio cargado
                    if (oS.descripcion == null)
                    {
                        listp.Add(new SqlParameter("@descripcion", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@descripcion", oS.descripcion));
                    }
                    if (oS.mail == null)
                    {
                        listp.Add(new SqlParameter("@mail", DBNull.Value));
                    }
                    else
                    {
                        listp.Add(new SqlParameter("@mail", oS.descripcion));
                    }

                    resultado = DB.EjecutarCommand(comando, listp, con, tran);

                    if (resultado > 0)
                    {
                        tran.Commit();
                    }
                }


            }
            catch (Exception Ex)
            {
                if (tran != null)
                {
                    tran.Rollback();
                }

                throw new Exception("Error al registrar una nueva OOSS: " + Ex.Message);
            }
            finally
            {

                con.Close();
            }
            return resultado;
        }


        //trae los id y los nombres de las OS vigentes, método que sirve para cargar los combos
        public static List<ObraSocial> obtenerTodasOS()
        {
            List<ObraSocial> list = null;
            SqlConnection conexion = DB.Conectar();
            try
            {
                string comando = "SELECT idObraSocial, nombreObraSocial FROM Obra_Social WHERE (fechaBaja IS NULL OR fechaBaja > GETDATE())";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                SqlDataReader dr = sqlcmd.ExecuteReader();

                if (dr.HasRows)
                {
                    list = new List<ObraSocial>();
                    ObraSocial os = null;
                    while (dr.Read())
                    {
                        os = new ObraSocial();
                        os.idObraSocial = int.Parse(dr["idObraSocial"].ToString());
                        os.nombre = dr["nombreObraSocial"].ToString();

                        list.Add(os);
                        os = null;
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                conexion.Close();
            }
            return list;
        }

        //busca los datos y el convenio de la OS que se corresponde con el id pasado por parametro
        public static ObraSocial obtenerOSconConvenio(int idOS)
        {
            ObraSocial os = null;
            SqlConnection conexion = DB.Conectar();
            SqlTransaction trans = null;
            try
            {
                trans = conexion.BeginTransaction();
                string comando = "SELECT Obra_Social.idObraSocial, Obra_Social.nombreObraSocial, Convenio_OS.idConvenioOS, Convenio_OS.fechaVigenciaDesde, Convenio_OS.fechaVigenciaHasta "
                                + "FROM Obra_Social INNER JOIN Convenio_OS ON Obra_Social.idConvenioOS = Convenio_OS.idConvenioOS "
                                + "WHERE (Obra_Social.idObraSocial = @idOS) AND (Convenio_OS.fechaVigenciaHasta IS NULL OR Convenio_OS.fechaVigenciaHasta > GETDATE())";
                SqlCommand sqlcmd = new SqlCommand(comando, conexion);
                sqlcmd.Parameters.Add(new SqlParameter("@idOS", idOS));
                sqlcmd.Transaction = trans;
                SqlDataReader dr = sqlcmd.ExecuteReader();
                if (dr.HasRows)
                {
                    os = new ObraSocial();
                    while (dr.Read())
                    {
                        os.idObraSocial = int.Parse(dr["idObraSocial"].ToString());
                        os.nombre = dr["nombreObraSocial"].ToString();
                        os.idConvenioObraSocial = int.Parse(dr["idConvenioOS"].ToString());

                        //convenio de la OS
                        os.miConvenioActual = new ConvenioOS();
                        os.miConvenioActual.idConvenioOS = int.Parse(dr["idConvenioOS"].ToString());
                        os.miConvenioActual.fechaVigenciaDesde = DateTime.Parse(dr["fechaVigenciaDesde"].ToString());
                        if (dr["fechaVigenciaHasta"] == DBNull.Value)
                            os.miConvenioActual.fechaVigenciaHasta = null;
                        else
                            os.miConvenioActual.fechaVigenciaHasta = DateTime.Parse(dr["fechaVigenciaHasta"].ToString());
                    }
                }
                dr.Close();

                //ahora cargamos el detalle del convenio de la OS buscada
                if (os != null)
                {
                    comando = "SELECT idDetalleConvenioOS, idDetalleConvenioOS, idEspecialidad, idPractica, fechaVigenciaDesde, fechaVigenciaHasta, precioAfiliado, precioMedico "
                        + "FROM Detalle_ConvenioOS WHERE (idConvenioOS = @idConvOS)";
                    sqlcmd = new SqlCommand(comando, conexion);
                    sqlcmd.Parameters.Add(new SqlParameter("@idConvOS", os.idConvenioObraSocial));
                    sqlcmd.Transaction = trans;
                    dr = sqlcmd.ExecuteReader();
                    if (dr.HasRows)
                    {
                        os.miConvenioActual.DetalleConvenioOS = new List<DetalleConvenioOS>();
                        DetalleConvenioOS objDetalleConvenio = null;
                        while (dr.Read())
                        {
                            objDetalleConvenio = new DetalleConvenioOS();
                            objDetalleConvenio.idDetalleConvenioOS = int.Parse(dr["idDetalleConvenioOS"].ToString());
                            objDetalleConvenio.idConvenioOS = int.Parse(dr["idDetalleConvenioOS"].ToString());
                            if (dr["idEspecialidad"] == DBNull.Value)
                                objDetalleConvenio.idEspecialidad = null;
                            else
                                objDetalleConvenio.idEspecialidad = int.Parse(dr["idEspecialidad"].ToString());
                            if (dr["idPractica"] == DBNull.Value)
                                objDetalleConvenio.idPractica = null;
                            else
                                objDetalleConvenio.idPractica = int.Parse(dr["idPractica"].ToString());
                            objDetalleConvenio.fechaVigenciaDesde = DateTime.Parse(dr["fechaVigenciaDesde"].ToString());
                            if (dr["fechaVigenciaHasta"] == DBNull.Value)
                                objDetalleConvenio.fechaVigenciaHasta = null;
                            else
                                objDetalleConvenio.fechaVigenciaHasta = DateTime.Parse(dr["fechaVigenciaHasta"].ToString());
                            objDetalleConvenio.precioAfiliado = float.Parse(dr["precioAfiliado"].ToString());
                            objDetalleConvenio.precioMedico = float.Parse(dr["precioMedico"].ToString());

                            //agregamos el detalle al convenio
                            os.miConvenioActual.DetalleConvenioOS.Add(objDetalleConvenio);
                            objDetalleConvenio = null;
                        }
                    }
                    dr.Close();

                    trans.Commit();
                }
                else
                {
                    trans.Rollback(); //no habia OS con convenio, por eso anulamos
                }
            }
            catch (Exception)
            {
                trans.Rollback();
                throw;
            }
            finally
            {
                conexion.Close();
            }
            return os;
        }
    }
}
